<?php
/**
 * 插件类
 * @author yangweijie <yangweijiester@gmail.com>
 */

namespace Common\Controller;

abstract class Addon{
  /**
   * 视图实例对象
   * @var view
   * @access protected
   */
  protected $view = null;

  /**
   * $info = array(
   *  'name'=>'Editor',
   *  'title'=>'编辑器',
   *  'description'=>'用于增强整站长文本的输入和显示',
   *  'status'=>1,
   *  'author'=>'thinkphp',
   *  'version'=>'0.1'
   *  )
   */
  public $info                =   array();
  public $addon_path          =   '';
  public $config_file         =   '';
  public $custom_config       =   '';
  public $admin_list          =   array();
  public $custom_adminlist    =   '';
  public $access_url          =   array();

  public function __construct(){
    $this->view         =   \Think\Think::instance('Think\View');
    $this->addon_path   =   ONETHINK_ADDON_PATH.$this->getName().'/';
    $TMPL_PARSE_STRING = C('TMPL_PARSE_STRING');
    $TMPL_PARSE_STRING['__ADDONROOT__'] = __ROOT__ . '/Addons/'.$this->getName();
    C('TMPL_PARSE_STRING', $TMPL_PARSE_STRING);
    if(is_file($this->addon_path.'config.php')){
      $this->config_file = $this->addon_path.'config.php';
    }
  }

  /**
   * 模板主题设置
   * @access protected
   * @param string $theme 模版主题
   * @return Action
   */
  final protected function theme($theme){
    $this->view->theme($theme);
    return $this;
  }

  //显示方法
  final protected function display($template=''){
    if($template == '')
      $template = CONTROLLER_NAME;
    echo ($this->fetch($template));
  }

  /**
   * 模板变量赋值
   * @access protected
   * @param mixed $name 要显示的模板变量
   * @param mixed $value 变量的值
   * @return Action
   */
  final protected function assign($name,$value='') {
    $this->view->assign($name,$value);
    return $this;
  }


  //用于显示模板的方法
  final protected function fetch($templateFile = CONTROLLER_NAME){
    if(!is_file($templateFile)){
      $templateFile = $this->addon_path.$templateFile.C('TMPL_TEMPLATE_SUFFIX');
      if(!is_file($templateFile)){
        throw new \Exception("模板不存在:$templateFile");
      }
    }
    return $this->view->fetch($templateFile);
  }

  final public function getName(){
    $class = get_class($this);
    return substr($class,strrpos($class, '\\')+1, -5);
  }

  final public function checkInfo(){
    $info_check_keys = array('name','title','description','status','author','version');
    foreach ($info_check_keys as $value) {
      if(!array_key_exists($value, $this->info))
        return FALSE;
    }
    return TRUE;
  }

  /**
   * 获取插件的配置数组
   */
  final public function getConfig($name=''){
    static $_config = array();
    if(empty($name)){
      $name = $this->getName();
    }
    if(isset($_config[$name])){
      return $_config[$name];
    }
    $config =   array();
    $map['name']    =   $name;
    $map['status']  =   1;
    $config  =   M('Addons')->where($map)->getField('config');
    if($config){
      $config   =   json_decode($config, true);
    }else{
      $temp_arr = include $this->config_file;
      foreach ($temp_arr as $key => $value) {
        if($value['type'] == 'group'){
          foreach ($value['options'] as $gkey => $gvalue) {
            foreach ($gvalue['options'] as $ikey => $ivalue) {
              $config[$ikey] = $ivalue['value'];
            }
          }
        }else{
          $config[$key] = $temp_arr[$key]['value'];
        }
      }
    }
    $_config[$name]     =   $config;
    return $config;
  }

  //必须实现安装
  abstract public function install();

  //必须卸载插件方法
  abstract public function uninstall();
}
